// 索引签名类型
interface AnyObject{
    [key:string]:number
}
// 使用所有类型
let obj:AnyObject={//可以有任意多个数据，是number类型的
    a:1,
    b:2
}
// 数组类型的,此时定义的一个数组类型，而不是一个对象
interface MyArray<T>{
    [n:number]:T
}
let arr:MyArray<string>=['a','b']

// 映射类型  只能用在类型别名中
type PropKeys='x'|'y'|'z'
type Type1={ [key in PropKeys]:number }
type Type2={ x:number,y:number,z:number }
// Type1和Type2的效果是一样的
// [key in PropKeys]中的key代表了可以是 PropKey中的任意一个

// 映射对象类型，不仅可以使用联合类型，也可以使用对象类型
type PropObject={ x:number,y:number,z:number }
//使用关键字 in keyof 可以进行映射,keyof获得对象类型中的联合类型 即'x'|'y'|'z'
type Type3={ [key in keyof PropObject]:number }
// 相当于
type Type4={
    x:number,
    y:number,
    z:number
}
// 泛型工具Partial的实现
type Partial1<T>={
   [P in keyof T]?:T[P]//相当于将与类型中的数值一一对应,每一个数据的类型，与之一一对应
}
type Pro={a:number,b:string,c:boolean}
// 使用数据
type PartialProps=Partial1<Pro>
type A=Pro['b']//将会得到Pro这个类型中b的属性类型
// 也可以查询多个数据类型
type B=Pro[ keyof Pro]//类似于['a'|'b']

// let arrf=[1,2,3]
// arrf.forEach